/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package geradorImagens;

import imagemBmp.FormatoBmp;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
import utilitarios.Conversoes;

/**
 *
 * @author jeferson
 */
public class CriarBmp {
    public static byte[] imagem;
    public static File caminho;
    
    public static FormatoBmp construirBmp(File arquivo){
        FormatoBmp novoFormato = new FormatoBmp();
        
        //definindo tamanho do tamanho do arquivo de entrada e convertendo o mesmo para um buffer de bytes
        imagem = new byte[(int)arquivo.length()];
        InputStream pegarBytes = null;
        try {
            pegarBytes = new FileInputStream(arquivo);
            caminho = arquivo;
        } catch (FileNotFoundException ex) {
            Logger.getLogger(CriarBmp.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            //pega o arquivo que esta na inputStream e convete para um buffer de bytes passado por parametro
            pegarBytes.read(imagem);
        } catch (IOException ex) {
            Logger.getLogger(CriarBmp.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        //gerando a estrutura do bmp
        for (int i = 0; i < 54; i++) {            
            if (i == 0 || i == 1) 
                novoFormato.BfType[i] = imagem[i];
            if (i >= 2 && i <= 5) 
                novoFormato.BfSize[i - 2] = imagem[i];
            if (i == 6 || i == 7) 
                novoFormato.BfReser1[i - 6] = imagem[i];
            if (i == 8 || i == 9) 
                novoFormato.BfReser2[i - 8] = imagem[i];
            if (i >= 10 && i <= 13) 
                novoFormato.BfOffSetBits[i - 10] = imagem[i];
            if (i >= 14 && i <= 17) 
                novoFormato.BiSize[i - 14] = imagem[i];
            if (i >= 18 && i <= 21) 
                novoFormato.BiWidth[i - 18] = imagem[i];
            if (i >= 22 && i <= 25) 
                novoFormato.BiHeight[i - 22] = imagem[i];
            if (i == 26 || i == 27)
                novoFormato.BiPlanes[i - 26] = imagem[i];
            if (i == 28 || i == 29) 
                novoFormato.BiBitCount[i - 28] = imagem[i];
            if (i >= 30 && i <= 33) 
                novoFormato.BiCompress[i - 30] = imagem[i];
            if (i >= 34 && i <= 37)
                novoFormato.BiSizeImag[i - 34] = imagem[i];
            if (i >= 38 && i <= 41) 
                novoFormato.BiXPPMeter[i - 38] = imagem[i];
            if (i >= 42 && i <= 45)
                novoFormato.BiYPPMeter[i - 42] = imagem[i];
            if (i >= 46 && i <= 49) 
                novoFormato.BiClrUsed[i - 46] = imagem[i];
            if (i >= 50 && i <= 53) 
                novoFormato.BiClrImpor[i - 50] = imagem[i];
        }
        
        short tamanho = Conversoes.byteArray2Short(novoFormato.BiBitCount);        
        //imagem de 255 cores, caso seja maior que 8 a imagem é trueCoolor: ignora a paleta de cores
        if(tamanho <= 8){            
            //criando a palheta de cores
            int numeroCores = (int) Math.pow(2, tamanho);
            novoFormato.paleta = new Pixel[numeroCores];
            int cont = 0;
            
            //o for vai da posição 54 até o numero de cores vezes quatro pois cada cor tem 4 bytes
            //indo até o numero de cores mais 54 bytes para descontar as 54 posições já lidas
            for(int i = 54; i < ((numeroCores*4)+54); i+=4){       
                Pixel novo = new Pixel();
                novo.setR(imagem[i]);
                novo.setG(imagem[i+1]);
                novo.setB(imagem[i+2]);
                novo.setA(imagem[i+3]);
                novoFormato.paleta[cont] = novo;
                cont++;
            }
        }
        
        //gerando vetor de dados da imagem isso independe ta paleta de cores
        int inicioAreaDados = Conversoes.byteArray2Int4(novoFormato.BfOffSetBits);  //pega o inicio da area da imagem
        int tamanhoArquivo = Conversoes.byteArray2Int4(novoFormato.BfSize);         //pega o tamanho do arquivo em bytes
        int tamanhoImagem = tamanhoArquivo - inicioAreaDados;
        novoFormato.imagem = new byte[tamanhoImagem];

        for(int i = inicioAreaDados; i < tamanhoArquivo; i++){
            novoFormato.imagem[i - inicioAreaDados] = imagem[i];
        }
        
        return novoFormato;
    }
}
